iT邦幫忙

2022 iThome 鐵人賽

DAY 6
2

Services

Service 指的是 Moleculer 框架中的微服務,也就是 broker 執行 createService 時的內容。例如你可以在微服務中定義 action 並且訂閱到 events ,要創建服務必須要定義好其綱目。

綱目概要

Service 主要有 nameversionsettingsactionsmethodsevents 六個部分:

  1. name <String> 是一個必填屬性,當我們要呼叫微服務時,會使用這個名字來進行呼叫,所以在命名時建議不要太過複雜。
  2. version <Number> | <String> 是選填的版本號,也同時是服務的前綴,可以用來執行多個相同名稱但不同版本的服務。
  3. settings <Object> 可用於設定靜態配置,然後透過 this.settings 來使用內部的配置。
  4. actions <Object> 用於建立可呼叫的共用方法,例如 CRUD 。可以使用 broker.callctx.call 來呼叫方法。
  5. methods <Object> 用於建立私有的方法,只可以在服務內呼叫它,但不能使用 broker.call 來呼叫它。
  6. events <Object> 用於訂閱事件活動。

今天會先用一些簡單的範例,讓大家快速的了解一下六個部分的用法,概念性的理解 Moleculer 的服務綱目:

baby.service.js

module.exports = {
    name: "baby",
    version: 1,
    settings: {
        weight: 0.5
    },
    actions: {
        create() {
            return "Baby " + this.gender() + " Born!";
        }
    },
    methods: {
        gender() {
            return Math.random() < this.settings.weight ? "Boy" : "Girl";
        }
    },
    events: {
        "baby.created"() {
            console.log("Congratulations!");
        },
    }
};

名稱與版本

在設定了服務的名稱與版本號後,在呼叫的時候可以加上版本前綴,並且指定服務的名稱及執行的方法,以 baby.service.js 為例,呼叫的範例如下:

broker.call("v1.baby.create");

設定

內部參數設定

核心模組 Service 提供了內部參數,這些參數設定會使用 $ 字號來命名。

名稱 類型 預設值 說明
$noVersionPrefix <Boolean> false 禁用版本號作為方法名稱的前綴。
$noServiceNamePrefix <Boolean> false 禁用服務名稱作為方法名稱的前綴。
$dependencyTimeout <Number> 0 依賴項逾時時間。
$shutdownTimeout <Number> 0 主動請求關閉逾時時間。
$secureSettings <Array> [] 安全設定列表,可將私密資訊限制僅在此服務可用。

patient.service.js

module.exports = {
    name: "patient",
    settings: {
        $secureSettings: ["patient.name"],
        patient: {
            id: "1",
            name: "Boxy Huang"
        }
    }
};

客製化參數

客製化參數設定,以 baby.service.js 為例,在 settings 中的 weight 就是一個客製化的參數,可以提供服務內運算使用。

混合函數

另外 settings 也可以將參數提供給 mixins 函數使用,例如在 API Gateway 服務中使用 moleculer-web 時,可以在 settings 中變更預設的連接埠號:

api.service.js

const ApiGateway = require("moleculer-web");

module.exports = {
    name: "api",
    mixins: [ApiGateway],
    settings: {
        // 變更連接埠
        port: 8080
    }
};

另外詳細合併方法可參考官方表格說明:

https://moleculer.services/docs/0.14/services.html#Merge-algorithm

Action

Action 可以是一個 Function 或是一個物件型態包含屬性設定及 handler , Action 必須被放在 actions 的鍵值。

module.exports = {
    name: "back-end",
    actions: {
		// 一般 Action
        sleep(ctx) {
            return "Sleeping!";
        },
		// 包含參數及 handler 的 Action
        burst: {
            params: {
                issue: "string",
            },
            handler(ctx) {
                return `Solve issue ${ctx.params.issue}`;
            }
        }
    }
};

Method

你可以在服務中 methods 的鍵下建立一個私有的函數。這個函數將會是私有的,它不能被其它 Broker 呼叫。但可以在相同服務中的 Action 或是 Event 等生命週期函數被呼叫。

注意, method 不可以使用以下保留字命名: nameversionsettingsmetadataschemabrokeractionslogger

module.exports = {
    name: "mailer",
    actions: {
        send(ctx) {
            // 呼叫 `sendMail` 方法
            return this.sendMail(ctx.params.recipients, ctx.params.subject, ctx.params.body);
        }
    },
    methods: {
        // 發送信件
        sendMail(recipients, subject, body) {
            return new Promise((resolve, reject) => {
                // ...
            });
        }
    }
};

Event

你可以在 events 的鍵下訂閱事件活動。

module.exports = {
    name: "report",

    events: {
        // 訂閱至 "user.created" 事件
        "user.created"(ctx) {
            this.logger.info("User created:", ctx.params);
            // Do something
        },
        // 訂閱至所有的 "user.*" 事件
        "user.*"(ctx) {
            console.log("Payload:", ctx.params);
            console.log("Sender:", ctx.nodeID);
            console.log("Metadata:", ctx.meta);
            console.log("The called event name:", ctx.eventName);
        }
        // 訂閱至本地事件
        "$node.connected"(ctx) {
            this.logger.info(`Node '${ctx.params.id}' is connected!`);
        }
    }
};

今天對服務做了基本的使用介紹,讓大家初步認識 Moleculer 的微服務綱目,到目前為止是不是看起來相當容易上手呢? 接下來筆者將進一步帶大家更深入的了解 Moleculer ,期待明天也能見到各位囉。

參考文獻

[1] Services, https://moleculer.services/docs/0.14/services.html

家家酒小劇場

  • Otter - 感覺腦袋中出現了微宇宙。
  • Boxy - 妳的小小宇宙是不是正在旋轉XD

上一篇
Day 5 : Broker
下一篇
Day 7 : Actions - Part 1
系列文
Moleculer 家家酒31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言